import md5 from 'js-md5'
const _ = require('lodash')
/**
 * 接口参数签名
 * @param {*} config 请求配置
 */
export const sign = config => {
  // 获取到秒级的时间戳,与后端对应
  // const tmp = new Date()
  //   .getTime()
  //   .toString()
  //   .substr(0, 10)
  const tmp = new Date()
    .getTime()
    .toString()
  const header = {
    appId: 'appId',
    timeStamp: tmp,
    sign: ''
  }
  let signStr = ''
  // let signStr = _.toString(header.appId)
  // signStr += _.toString(header.timeStamp)
  console.info('signStr config===>', config)
  if (config.params) {
    // url参数签名
    const pArray = []
    for (const p in config.params) {
      console.info('signStr config pArray ===>', p)
      pArray.push(p)
    }
    pArray.push('appId')
    console.info('pArray===> ', pArray)
    const sArray = pArray.sort()
    const copyParams = {}
    Object.assign(config.params, copyParams)
    copyParams.put('appId', header.appId)
    for (const item of sArray) {
      signStr += item + _.toString(copyParams[item])
    }
  } else if (config.data) {
    const copyParams = config.data
    copyParams.appId = header.appId
    const result = objKeySort(copyParams)
    // request body参数的内容
    signStr += JSON.stringify(result)
  }
  // 签名核心逻辑
  const newSignStr = _.sortBy(signStr, s => s.charCodeAt(0)).join('')
  const s = md5(newSignStr).toUpperCase()
  header.sign = s
  const token = config.data.token
  if ((typeof (token) !== 'undefined') || (typeof (token) === 'object') || token) {
    delete config.data['token']
  }
  config = Object.assign(config, { headers: header })
  return config
}

function objKeySort (obj) { // 排序的函数
  const newkey = Object.keys(obj).sort()
  // 先用Object内置类的keys方法获取要排序对象的属性名，再利用Array原型上的sort方法对获取的属性名进行排序，newkey是一个数组
  const newObj = {} // 创建一个新的对象，用于存放排好序的键值对
  for (let i = 0; i < newkey.length; i++) { // 遍历newkey数组
    newObj[newkey[i]] = obj[newkey[i]] // 向新创建的对象中按照排好的顺序依次增加键值对
  }
  return newObj // 返回排好序的新对象
}
// export const strToUint8 = (str) => {
//   for (var i = 0, arr = []; i < str.length; i++) {
//     arr.push(str.charCodeAt(i))
//   }
//   return new Uint8Array(arr)
// }
// function stringToByte (str) {
//   let c
//   const len = str.length
//   const bytes = []
//   for (let i = 0; i < len; i++) {
//     c = str.charCodeAt(i)
//     if (c >= 0x010000 && c <= 0x10FFFF) {
//       bytes.push(((c >> 18) & 0x07) | 0xF0)
//       bytes.push(((c >> 12) & 0x3F) | 0x80)
//       bytes.push(((c >> 6) & 0x3F) | 0x80)
//       bytes.push((c & 0x3F) | 0x80)
//     } else if (c >= 0x000800 && c <= 0x00FFFF) {
//       bytes.push(((c >> 12) & 0x0F) | 0xE0)
//       bytes.push(((c >> 6) & 0x3F) | 0x80)
//       bytes.push((c & 0x3F) | 0x80)
//     } else if (c >= 0x000080 && c <= 0x0007FF) {
//       bytes.push(((c >> 6) & 0x1F) | 0xC0)
//       bytes.push((c & 0x3F) | 0x80)
//     } else {
//       bytes.push(c & 0xFF)
//     }
//   }
//   return new Int8Array(bytes)
// }
